package cn.rkylin.oms.base.refundReasonType.utils.apprhandler.impl;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import cn.rkylin.oms.aftersale.sysrefund.domain.SysRefundSku;
import cn.rkylin.oms.aftersale.sysrefund.vo.SysRefundVO;
import cn.rkylin.oms.aftersale.sysreturn.vo.SysReturnVO;
import cn.rkylin.oms.base.refundReasonType.utils.apprhandler.ApprHandler;
import cn.rkylin.oms.common.consts.YesNoConst;
import cn.rkylin.oms.warehouse.returnStockin.vo.ReturnStockinSkuVO;

/**
 * 类名:NoReturnHanderl <br/>
 * 作用: 未创建退货单、退货单未完成、退货单已完成且退入数与退货数不符（商品品类或者数量不符）. <br/>
 * 创建时间:     2017年11月3日 下午2:41:09 <br/>
 * @author   zhanghao
 * @version  v1.0 
 */
public class NoReturnHandler extends ApprHandler {
    private String ruleContent = "未创建退货单、退货单未完成、退货单已完成且退入数与退货数不符（商品品类或数量不符）；";

    /**
     * @see cn.rkylin.oms.base.refundReasonType.utils.apprhandler.ApprHandler#getRuleContent()
     */
    @Override
    protected String getRuleContent() {
        return ruleContent;
    }

    /**
     * @see cn.rkylin.oms.base.refundReasonType.utils.apprhandler.ApprHandler#isValid(cn.rkylin.oms.aftersale.sysrefund.vo.SysRefundVO)
     */
    @Override
    protected boolean isValid(SysRefundVO sysRefundVO) throws Exception {
        boolean returnValue = true;
        /*
         * 审核该原因退款单时，先判断如果退款单为仅退款，则审核该原因的退款单时不校验该条规则，如果为即退款又退货，再视该条规则是否启用进行校验；<br/>
         * 未创建退货单、退货单未完成:<br/>
         * 如果该原因的退款单关联订单未创建未废弃的退货单、存在未废弃退货单但未完成，审核该原因的退款单失败，要给出失败原因；<br/>
         * 如果不存在上述情况，该条规则校验通过.<br/>
         */
        if(YesNoConst.YES.equalsIgnoreCase(sysRefundVO.getHasGoodReturn())) {
            List<SysReturnVO> sysReturnVOList = sysRefundVO.getSysReturnVOList();
            if(sysReturnVOList.size()==0) {
                //  未找到退货单
                returnValue = false;
            }else {
                boolean dontHaveUnCanceled = true;  // 不包含未取消退货单
                boolean hasUnCanceledAndUnComplete = false; // 包含未取消且未完成的退货单
                boolean hasUnMatchedSku = false;    // 退入数与退货数不符

                List<SysRefundSku> sysRefundSkuList = sysRefundVO.getSysRefundSkuList();
                Set<String> keySet = new HashSet<String>();

                // 获取退款商品的SkuId集合
                for(SysRefundSku sysRefundSku:sysRefundSkuList){
                    keySet.add(sysRefundSku.getSkuCode());
                }

                for (SysReturnVO sysReturnVO : sysReturnVOList) {
                    if(YesNoConst.NO.equals(sysReturnVO.getIsCancel())) {
                        dontHaveUnCanceled = false;
                        if(!"z".equalsIgnoreCase(sysReturnVO.getReturnStatus())){
                            hasUnCanceledAndUnComplete = true;
                        }else{
//                            List<ReturnStockinSkuVO> sysFactReturnSkuList = returnStockinSkuDAO.selectFactReturnStockinSkuBySourceId(sysReturnVO.getReturnId());
                            List<ReturnStockinSkuVO> sysPlanReturnSkuList = returnStockinSkuDAO.selectPlanReturnStockinSkuBySourceId(sysReturnVO.getReturnId());
                            for(ReturnStockinSkuVO returnStockinSkuVO:sysPlanReturnSkuList){
                                // 如果退入商品有退货差异，且退货差异为有破损，则校验失败
                                if(YesNoConst.YES.equalsIgnoreCase(returnStockinSkuVO.getIsExcept())&&returnStockinSkuVO.getExceptReason().contains("INQTY_ERROR")){
                                    if(keySet.contains(returnStockinSkuVO.getSkuCode())){
                                        hasUnMatchedSku = true;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }

                // 未找到有效的退货单，或者有有效退货单未完成，或者退款商品有退货异常（数量不符）则返回错误
                if(dontHaveUnCanceled||hasUnCanceledAndUnComplete||hasUnMatchedSku) {
                    returnValue = false;
                }
            }
        }
        return returnValue;
    }

    private int[] ruleCheckArray = { 5 };
    /**
     * @see cn.rkylin.oms.base.refundReasonType.utils.apprhandler.ApprHandler#getRuleCheckArray()
     */
    @Override
    protected int[] getRuleCheckArray() {
        return ruleCheckArray;
    }
}

